package org.codert.codertadmin.config;

import org.codert.codertadmin.web.controller.HelloController;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;


/**
 *  SpringSecurity的原理，就是配置一个Tomcat的Filter，里边在封装着多条自定义的SpringSecurity的Filter。
 *  所有的配置都会被收集到WebSecurity中，这是一个Builder，最后通过build()方法构造出一个实际为FilterChainProxy的Tomcat Filter，
 *  里边默认有一条拦截所有请求的过滤器链。
 *
 *  WebSecurity是构造核心
 *  HttpSecurity其实是一个WebSecurity构造FilterChainProxy时的一个默认的securityFilterChainBuilder，会创造一条拦截所有请求的链
 *  去看WebSecurity的performBuild就明白了，比如
 */

/**
 * @author: TanJingyu
 * @create: 2021-08-05 10:27
 **/

@ConditionalOnBean(HelloController.class)
@Configuration(proxyBeanMethods = false)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
    }

    /**
     * 默认给WebSecurity加了一条生成默认过滤器链的SecurityFilterChainBuilder,是HttpSecurity
     * HttpSecurity默认拦截所有请求，有很多常用的过滤器
     *
     * 一般我们在加一条链的情况不多，有需求在这条默认链里加过滤器应该就够了
     * Oauth2的授权服务器倒是另外又创建了一条
     */
    @Override
    public void init(WebSecurity web) throws Exception {
        super.init(web);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
        web.ignoring().antMatchers("/hello/**");
    }


    /**
     * WebSecurity中的一个securityFilterChainBuilders，用来构造一条链。
     * 定义拦截的路径，有哪些过滤器等等
     *
     * 一般我们的需求还不至于在WebSecurity中另加一条链，一般只需要在这条链中加一些 过滤器就行了
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
    }
}
